package com.java.basis.thread.n7;

import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;

/**
 * 不可变类的使用
 *
 * @author wangning
 * @create 2022-01-29 16:04
 */
@Slf4j(topic = "c.Test01")
public class Test01 {
	public static void main(String[] args) {
		//SimpleDateFormat 在多线程的情况下会出现线程不安全的情况，使用是要加锁的
		//使用加锁的方法会造成性能问题
		//我们可以使用哪些不可变类进行操作，就不需要加锁

//		test01();
		test02();

	}

	/**
	 * 直接使用线程安全类
	 * jdk8 新引入的对象
	 */
	private static void test02() {
		DateTimeFormatter stf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
		for (int i = 0; i < 10; i++) {
			new Thread(() -> {
				log.debug("{}", stf.parse("1951-04-21"));
			}).start();

		}
	}

	/**
	 * 这种方法是需要加锁才能解决线程安全问题
	 */
	private static void test01() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		for (int i = 0; i < 10; i++) {
			new Thread(() -> {
				synchronized (sdf) {
					try {
						log.debug("{}", sdf.parse("1951-04-21"));
					} catch (ParseException e) {
						e.printStackTrace();
						log.debug("{}", e);
					}
				}
			}).start();

		}
	}
}
